/**
 * 
 */
package baduga.server;

import java.util.ArrayList;

/**
 * @author Janek
 *
 */
public class Player {
	
	/** Pseudonim gracza */
	private String nickname;
	
	/** Finanse gracza */
	private int funds = Game_Cfg.PLAYER_FUNDS_LOG;
	
	/** Statistic 0 - Win, 1 - Draw, 2 - Loss */
	private int[] stats = new int[] {0, 0, 0};
	
	/** Status gracza
	 * 
	 * <pre>
	 * 0 - wolnyStrzelec
	 * 1 - Obserwator
	 * 2 - Gracz
	 * </pre>
	 * 
	 * */
	private int statusPlayer = 0;
	
	/** Identyfikator stołu */
	private String tableID = "";
	
	/** Identyfikator gracza */
	private String playerID = "";
	
	
	/** Uchwyt do wątku */
	private Network_API__Client_Thread myThread;
	
	
	
	/**
	 * Konstuktor
	 * 
	 * @param nickname
	 */
	public Player(String nickname)
	{
		this.nickname = nickname;
	}
	
	

	

	/**
	 * Sprawdza czy gracz w danej chwili posiada określoną ilość środków
	 * 
	 * - Fałsz jeśli stać
	 * - True jak nie stać
	 * 
	 * @param paid
	 * @return
	 */
	public boolean checkFunds(final int  paid)
	{
		boolean opStatus;
		
		
		if(paid <= funds)
		{
			opStatus =  false;
		}
		else
		{
			opStatus =  true;
		}
		
		return opStatus;
	}
	
	
	
	
	
	/**
	 * Sprawdza poprawność danych wejściowych. Zanim utworzy obiekt Player
	 * 
	 * 
	 * @param nickName
	 * @return
	 */
	public static Object[][] validate(String nickName)
	{
		//Definicja
		Object[][] rData;
		
		//Inicjalizacja
		rData = new Object[][] {
			new Object [] {
					true
			},
			null
		};
		
		//Lista
		ArrayList tmpData = new ArrayList();
		
		
		if(nickName.length() < Game_Cfg.PLAYER_NAME_LIM[0] || nickName.length() > Game_Cfg.PLAYER_NAME_LIM[1])
		{
			tmpData.add(0x00);
		}
		
		
		
		if(tmpData.size() > 0)
		{
			//Ustawienie flagi
			rData[0][0] = false;
			
			rData[1] = tmpData.toArray();
		}
		
		return rData;
	}
	
	
	
	
	
	/**
	 * Zwraca w formie tekstowej własności klasy
	 */
	public String toString()
	{
		return "Login: " + this.nickname + " | Fundusze " + this.funds + " | Status " + this.statusPlayer + " | IDTable " + this.tableID + " | PlayerID " + this.playerID;
	}
	
	
	
	//------------------ [setters] - #start -----------------
	
	
	
	/**
	 * Pamietaj o sprawdzeniu metodą checkfunds
	 * @param paid
	 * @return
	 */
	public void setFunds(final int paid)
	{
		funds += paid;
	}
	
	
	/**
	 * Aktualizuje pseudonim gracza
	 * @param newNickname
	 */
	public void setNickName(final String newNickname)
	{
		nickname = newNickname;
	}
	
	
	/**
	 * Aktualizuje statystyki gracza wg. typu 0, 1, 2
	 * 
	 * @param type
	 * @param change
	 */
	public boolean setStats(final int type)
	{
		boolean opStatus;
		
		if(type > -1 && type < 3)
		{
			this.stats[type] += 1;
			opStatus = true;
		}
		else
		{
			//TODO: Komuniakat błędu
			opStatus = false;
		}
		
		return opStatus;
	}
	
	
	/**
	 * Ustawia Identyfikator stołu przy którym siedzi gracz.
	 * 
	 * @param nTableID
	 */
	public void setTableId(String nTableID)
	{
		this.tableID = nTableID;
	}
	
	
	/**
	 * Ustawia Identyfikator stołu przy którym siedzi gracz.
	 * 
	 * @param nTableID
	 */
	public void setPlayerId(String nPlayerID)
	{
		this.playerID = nPlayerID;
	}
	
	
	/**
	 * Ustala status gracza
	 * 
	 * @param status
	 */
	public void setStatusPlayer(int status)
	{
		this.statusPlayer = status;
	}
	
	
	/**
	 * Ustawia Link do mojego wątku
	 * 
	 * @param nMyThread
	 */
	public void setMyThread(final Network_API__Client_Thread nMyThread)
	{
		this.myThread = nMyThread;
	}
	
	
	
	//------------------ [setters] - #end -----------------
	
	
	//------------------ [getters] - #start -----------------
	/**
	 * Zwraca kolekcje statystyk
	 * 
	 * @return
	 */
	public Integer[] getFullStats()
	{
		Integer[] tmp = new Integer[ this.stats.length ];
		
		for(int i = 0; i < this.stats.length; i++)
		{
			tmp[i] = this.stats[i];
		}
		
		
		return tmp;
	}
	
	

	
	
	/**
	 * zwraca Login gracza
	 * 
	 * @return
	 */
	public String getNickName()
	{
		return this.nickname;
	}
	
	/**
	 * Zwraca aktualny stan funduszy gracza
	 * 
	 * @return
	 */
	public int getFunds()
	{
		return this.funds;
	}
	
	/**
	 * Zwraca identyfikator stołu przy którym siedzi gracz.
	 * 
	 * @return
	 */
	public String getTableId()
	{
		return this.tableID;
	}
	
	/**
	 * Zwraca identyfikator gracza.
	 * 
	 * @return
	 */
	public String getPlayerId()
	{
		return this.playerID;
	}
	
	/**
	 * Zwraca status gracza 
	 * 
	 * @return
	 */
	public int getStatusPlayer()
	{
		return this.statusPlayer;
	}
	
	
	/**
	 * Zwraca status dla stołu  (Pomniejszony o -1, aby pasował do def. stołu)
	 * 
	 * @return
	 */
	public int getStatusPlayerForTable()
	{
		return this.statusPlayer - 1;
	}
	
	
	/**
	 * Zwraca uchwyt do wątku
	 * 
	 * @return
	 */
	public Network_API__Client_Thread getMyThread()
	{
		return this.myThread;
	}
	
	//------------------ [getters] - #end -----------------
	
	
	
	

}
